-
-
Notifications
You must be signed in to change notification settings - Fork 622
feat: support column.resizable #1106
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
|
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
02c41ed to
0eab6c4
Compare
|
体验有点怪异,如果是超出 width 的时候缩小应该就是缩小,不应该把右边的撑开才对。 |
6ad31d3 to
c50f2da
Compare
c50f2da to
97d5903
Compare
|
waiting for it😊 |
3 similar comments
|
waiting for it😊 |
|
waiting for it😊 |
|
waiting for it😊 |
|
waiting for it |
1 similar comment
|
waiting for it |
|
waiting for it😊 |
1 similar comment
|
waiting for it😊 |
|
waiting for it,Please merge it |
|
antd v6 有没有可能 table 组件基于 TanStack Table 重构呢?我感觉 tanstack table 作为 table 引擎,数据逻辑层面的东西都封装好了,我们只需要基于它做一层很薄的封装即可,剩下的就是样式问题了,而且引入它也不存在依赖剧增的情况(说实话 antd 整个包也不小了),当然这是只是建议,具体看官方怎么决断 |
用 TanStack Table 不太可能,但是 rc-table 这个库之前有重构的计划,具体看 @zombieJ 有没有时间了 |
|
waiting for it,Please merge it |
2 similar comments
|
waiting for it,Please merge it |
|
waiting for it,Please merge it |
Added optional 'title' prop to MeasureCell component.
Refactor MeasureRow component to use props instead of destructuring in the function signature.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
src/Table.tsx (1)
140-144: 对外 API onColumnResizeEnd 的命名与结构建议命名与内部
colsWidths/colWidths存在不一致;建议统一术语,避免columnWidthsvscolWidths混用。同时,为提升查询效率与可读性,考虑将columnWidths从数组改为 Record/Map(O(1) 查找),或并行提供两种形式。
🧹 Nitpick comments (5)
src/interface.ts (2)
66-66: 建议为 scrollbar 属性添加文档说明。
scrollbar属性缺少 JSDoc 注释,建议补充说明其用途和使用场景,例如是否用于标识虚拟滚动条列。这将有助于其他开发者理解该属性的作用。可以考虑添加类似如下的文档:
className?: string; style?: React.CSSProperties; children?: React.ReactNode; + /** Column configuration with optional scrollbar metadata */ column?: ColumnsType<RecordType>[number] & { scrollbar?: boolean }; colSpan?: number; rowSpan?: number;
130-130: 建议为 resizable 属性添加详细文档。
resizable属性作为列宽调整功能的核心 API,建议添加 JSDoc 注释说明:
- 该属性的作用(是否允许用户拖拽调整列宽)
- 默认值(未设置时的行为)
- 与其他属性的交互(如
width、minWidth等)这将帮助用户更好地理解和使用该功能。
可以考虑添加类似如下的文档:
rowSpan?: number; width?: number | string; minWidth?: number; + /** Whether the column can be resized by dragging. Defaults to false. */ resizable?: boolean; onCell?: GetComponentProps<RecordType>;src/context/TableContext.tsx (1)
64-66: 回调重命名合理,但需处理旧字段歧义与文档说明
- onColumnWidthChange 命名清晰,但同时保留 colWidths(数组)与新增 colsWidths(Map)/colsKeys 会造成概念重复与状态分裂风险。建议标注 colWidths 为废弃,指引改用新组合。
- 建议为回调补充最小文档(单位/裁剪规则),避免二义性。
可考虑如下微调(仅类型注释与废弃标记):
- onColumnWidthChange: (columnKey: React.Key, width: number) => void; + /** width 单位:px;应为已按 minWidth/maxWidth 约束后的值 */ + onColumnWidthChange: (columnKey: React.Key, width: number) => void; - colWidths: number[]; + /** @deprecated 请改用 colsWidths + colsKeys;后续将移除 */ + colWidths: number[];src/Table.tsx (2)
392-396: useMemo 依赖使用 join 带来不必要开销与潜在碰撞
pureColsKeys.join('_')每次 render 做 O(n) 字符串拼接,且当 key 含下划线可能造成误判。这里colsKeys仅回传pureColsKeys本身,useMemo意义有限。建议简化:- const pureColsKeys = getColumnsKey(flattenColumns); - const colsKeys = React.useMemo(() => pureColsKeys, [pureColsKeys.join('_')]); + const pureColsKeys = getColumnsKey(flattenColumns); + // 直接使用或以引用为依赖即可 + const colsKeys = React.useMemo(() => pureColsKeys, [pureColsKeys]); + // 或:const colsKeys = pureColsKeys;
447-450: 为 onColumnWidthChange 增加输入健壮性(NaN/负值/无穷)拖拽过程中可能产生异常宽度,建议在入口处校验,避免状态抖动与布局异常。
- const onColumnWidthChange = React.useCallback((columnKey: React.Key, width: number) => { + const onColumnWidthChange = React.useCallback((columnKey: React.Key, width: number) => { + if (!Number.isFinite(width) || width < 0) { + return; + } updateColsWidths(widths => { if (widths.get(columnKey) !== width) { const newWidths = new Map(widths);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (12)
README.md(1 hunks)assets/index.less(3 hunks)package.json(0 hunks)src/Body/MeasureCell.tsx(1 hunks)src/Body/MeasureRow.tsx(3 hunks)src/Body/index.tsx(3 hunks)src/FixedHolder/index.tsx(1 hunks)src/Header/HeaderRow.tsx(3 hunks)src/Table.tsx(9 hunks)src/VirtualTable/BodyGrid.tsx(3 hunks)src/context/TableContext.tsx(2 hunks)src/interface.ts(2 hunks)
💤 Files with no reviewable changes (1)
- package.json
🚧 Files skipped from review as they are similar to previous changes (7)
- src/Body/index.tsx
- src/FixedHolder/index.tsx
- src/Body/MeasureCell.tsx
- src/Header/HeaderRow.tsx
- assets/index.less
- src/VirtualTable/BodyGrid.tsx
- README.md
🔇 Additional comments (8)
src/Body/MeasureRow.tsx (1)
11-11: LGTM!属性重命名一致且清晰从
onColumnResize重命名为onColumnWidthChange在整个文件中应用一致(接口定义、解构、回调调用和属性传递),有助于区分职责并提高代码清晰度。Also applies to: 18-18, 30-30, 45-45
src/context/TableContext.tsx (1)
78-86: fullTableRef 类型不空安全;建议使用只读集合类型暴露上下文以避免误改
- fullTableRef 目前为 MutableRefObject,常规 useRef(null) 初始为 null,类型不匹配且可能导致非空断言滥用。应改为 MutableRefObject<HTMLDivElement | null>。
- 上下文中暴露的 Map/数组若被外部原地修改,会引发不可预期的共享可变状态。建议使用 ReadonlyMap 与 readonly 数组。
- onColumnResizeEnd 的 columnWidths 可设为 ReadonlyArray 以保持一致的只读语义。
请考虑如下类型调整:
- fullTableRef: React.MutableRefObject<HTMLDivElement>; - colsWidths: Map<React.Key, number>; - colsKeys: React.Key[]; + fullTableRef: React.MutableRefObject<HTMLDivElement | null>; + colsWidths: ReadonlyMap<React.Key, number>; + colsKeys: readonly React.Key[]; - onColumnResizeEnd?: (info: { - columnKey: React.Key; - width: number; - columnWidths: { columnKey: React.Key; width: number }[]; - }) => void; + onColumnResizeEnd?: (info: { + columnKey: React.Key; + width: number; + columnWidths: ReadonlyArray<{ columnKey: React.Key; width: number }>; + }) => void;可用脚本快速核查影响面与遗留命名:
src/Table.tsx (6)
242-242: 解构追加 onColumnResizeEnd:OK按预期将对外回调贯通到组件内部。
837-837: 正在拖拽态 className:OK新增
${prefixCls}-column-resizing有利于样式与交互隔离。
914-914: 向下传递 onColumnWidthChange:OK命名与职责清晰,便于区分变化与结束事件。
929-934: 上下文扩展:OK,但建议确认重置时机
onResizingChange: setIsResizing贯通合理。请确保在拖拽取消/组件卸载时回落为false,避免残留“正在拖拽”的 UI 状态。
950-950: 依赖中加入 fullTableRef:OKRef 对象本身稳定,加入依赖通常不必要;若为满足 lint 要求可保留。
974-980: 对象字面量重复传入 colWidths,后者会覆盖前者(功能风险)在同一对象中出现两次
colWidths,会导致前一处值被覆盖,可能引入难排查的行为差异。请移除重复项。onColumnWidthChange, colsWidths, colsKeys, - colWidths, onColumnResizeEnd, setIsResizing, - colWidths, + colWidths,另:此处使用
setIsResizing,而其它位置通过onResizingChange命名传递,建议统一命名以降低心智负担。Also applies to: 980-980
|
waiting for it,Please merge it |
1 similar comment
|
waiting for it,Please merge it |
|
waiting for it,Please merge it |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (3)
src/VirtualTable/BodyGrid.tsx (1)
24-42: 在useEffect依赖中补充onColumnWidthChange,避免闭包过期这里的 effect 目前只依赖
columnsWidth,如果未来TableContext中的onColumnWidthChange被替换(例如内部 hooks 或 refactor),effect 不会重新执行,会继续使用旧回调,也会触发 hooks lint 警告。建议把它一并放进依赖数组:- React.useEffect(() => { - columnsWidth.forEach(([key, width]) => { - onColumnWidthChange(key, width); - }); - }, [columnsWidth]); + React.useEffect(() => { + columnsWidth.forEach(([key, width]) => { + onColumnWidthChange(key, width); + }); + }, [columnsWidth, onColumnWidthChange]);当前实现因为回调本身是稳定的不会立刻出 bug,但按 hooks 规范补齐依赖会更安全一些。
Also applies to: 73-77
src/Table.tsx (2)
391-399: 列宽度追踪逻辑整体 OK,但join('_')依赖写法可以更直观一些用
Map<React.Key, number>存colsWidths,再按colsKeys映射出colWidths并通过useMemo保持引用稳定,这个思路是合理的,也有利于减少下游useMemo/useEffect的无效重算。不过当前用
pureColsKeys.join('_')/pureColWidths.join('_')作为依赖 key 的写法可读性略差,而且存在极小概率的拼接冲突(例如特殊字符串 key)。可以考虑用更直接的写法来表达“当列定义或宽度数组实际变化时才更新”,例如:- const pureColsKeys = getColumnsKey(flattenColumns); - const colsKeys = React.useMemo(() => pureColsKeys, [pureColsKeys.join('_')]); - const pureColWidths = colsKeys.map(columnKey => colsWidths.get(columnKey)); - const colWidths = React.useMemo(() => pureColWidths, [pureColWidths.join('_')]); + const colsKeys = React.useMemo( + () => getColumnsKey(flattenColumns), + [flattenColumns], + ); + const colWidths = React.useMemo( + () => colsKeys.map(columnKey => colsWidths.get(columnKey)), + [colsKeys, colsWidths], + );功能等价但更易读,也避免了手工
join依赖的潜在问题;如果后续 profiling 发现确有性能差异,再针对性优化即可。Also applies to: 447-456, 915-916, 971-977, 980-980
874-935: TableContext 新增字段及依赖基本正确,可顺手清理一些小瑕疵
TableContextValue中新增的onColumnWidthChange、colsWidths、colsKeys、colWidths、onColumnResizeEnd、onResizingChange、fullTableRef等都已经同时出现在 value 和依赖列表中,能保证消费方在列宽/拖拽状态变化时正确更新。结合之前关于 context 依赖必须与字段保持同步的经验来看,这里整体是对的。Based on learnings, 这一点非常重要。有两点可以顺便打磨下:
- 依赖数组里
colWidths出现了两次(行 977 和 980),虽然完全无害,但会迷惑后续维护者。fullTableRef本身是一个稳定的 ref 对象,把它放进useMemo依赖不会带来问题,但也不会随着.current的变化而重新计算 context;如果只是为了把 ref 传下去,其实可以不放在依赖列表里,让依赖更聚焦于真正决定渲染的数据/配置。可以在不改变行为的前提下,把重复和不必要的依赖精简掉,使这一块更干净一些。
Also applies to: 936-996
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
README.md(1 hunks)package.json(0 hunks)src/Table.tsx(9 hunks)src/VirtualTable/BodyGrid.tsx(3 hunks)
💤 Files with no reviewable changes (1)
- package.json
🚧 Files skipped from review as they are similar to previous changes (1)
- README.md
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2024-11-08T12:53:09.293Z
Learnt from: bbb169
Repo: react-component/table PR: 1202
File: src/Table.tsx:903-904
Timestamp: 2024-11-08T12:53:09.293Z
Learning: 在 `src/Table.tsx` 文件的 React 组件 `Table` 中,即使 `bodyScrollLeft` 频繁更新,也需要在 `TableContextValue` 的 `useMemo` 依赖数组中包含 `bodyScrollLeft` 和 `headerCellRefs`,因为每次滚动时重新计算 `TableContextValue` 是解决该问题所必须的。
Applied to files:
src/VirtualTable/BodyGrid.tsxsrc/Table.tsx
🧬 Code graph analysis (1)
src/Table.tsx (2)
src/interface.ts (1)
Key(21-21)src/utils/valueUtil.tsx (1)
getColumnsKey(17-34)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: test / react component workflow
🔇 Additional comments (2)
src/Table.tsx (2)
140-145:onColumnResizeEnd的 API 设计合理,透传链路清晰
onColumnResizeEnd暴露{ columnKey, width, columnWidths }这一结构基本能覆盖调用方需求,并且已经在props解构和TableContext中完整透传,看起来自洽,没有明显边界问题。和内部的onColumnWidthChange职责区分也比较清晰。Also applies to: 240-243, 932-933, 978-978
392-393:isResizing状态与样式联动实现合理新增的
isResizing状态通过onResizingChange: setIsResizing暴露到上下文,同时在根节点上加上${prefixCls}-column-resizingclass,用于在拖拽中控制样式/交互,这是一个简单直接的设计,状态来源和消费方都清晰,没有发现逻辑问题。Also applies to: 837-838, 933-934, 979-979
|
Sorry for delay. We have plans for a major refactor of the Table component to enable better feature extensibility. Merging this PR now may introduce additional complexity to that refactor, so we would prefer to add this functionality after the refactor is completed. Unfortunately, we haven’t been able to secure time to work on the refactor yet. |

原先内部
onColumnResize重命名为onColumnWidthChange,进行区分Summary by CodeRabbit
新功能
样式
文档
测试
其它
✏️ Tip: You can customize this high-level summary in your review settings.